Objetivo: generar el conocimiento básico para importar, modificar, escribir y graficar datos, así como escribir ciclos utilizando el Proyecto R para computación estadística.
Contenido:
Para importar datos a R podemos utilizar la función read.table, la cual devuelve un objeto data.frame.
read.table(file, header = FALSE, sep = "",
dec = ".", row.names, col.names, na.strings = "NA",
skip = 0, stringsAsFactors = FALSE, ...)file: el nombre del archivo desde el cual se leerán los datos.
header: un valor lógico que indica si el archivo contiene el nombre de las variables en la primera línea.
sep: el caracter separador de campos. Los valores en cada línea del archivo están separados por este caracter.
read.table(file, header = FALSE, sep = "",
dec = ".", row.names, col.names, na.strings = "NA",
skip = 0, stringsAsFactors = FALSE, ...)dec: el caracter utilizado en el archivo para los puntos decimales.
na.strings: un vector de caracteres que se interpretarán como valores NA.
stringsAsFactors: [Lógico] ¿Deben convertirse los vectores de caracteres en factores?
Recuerda que si no agregamos alguno de estos argumentos, se usará la configuración predeterminada.
Creemos una tabla en Excel
Guarde la tabla como un archivo csv:
Usaremos la ruta del archivo en la función read.table.
Podemos utilizar también la función read.csv:
Las funciones read.table, read.csv y read.csv2 se pueden utilizar para importar datos. Tenga en cuenta que las funciones read.csv y read.csv2 provienen de read.table pero tienen diferentes configuraciones por defecto.
read.table header = FALSE, sep = " "
read.csv header = TRUE, sep = ","
read.csv2 header = TRUE, sep = ";"
dim: devuelve el número de filas y columnas (es decir, las dimensiones) del objeto.
Ahora podemos agregar una nueva columna al data frame existente. Como ejemplo, vamos a calcular los valores de precipitación menos evapotranspiración:
El acceso a los datos es el mismo para las matrices y los data frames. Por ejemplo, para extraer el valor ubicado en la segunda fila y la cuarta columna:
O:
También podemos obtener los tres primeros valores de la tercera fila.
O hacer un subconjunto del data frame.
Para exportar datos, podemos utilizar la función write.table, que exporta el objeto utilizado a un directorio específico.
write.table(x, file = "", append = FALSE, quote = TRUE, sep = " ",
na = "NA", dec = ".", row.names = TRUE, ...)x: el objeto a escribir (una matriz o un data frame).
file: la ruta de archivo donde queremos guardar el archivo (incluyendo el nombre y extensión del archivo).
append: [Lógico] Si es TRUE, la salida se agrega al archivo existente. Si es FALSE, cualquier archivo existente con el mismo nombre se destruye.
write.table(x, file = "", append = FALSE, quote = TRUE, sep = " ",
na = "NA", dec = ".", row.names = TRUE, ...)quote: [Lógico] si es TRUE, cualquier columna de caracteres o factores estará rodeada de comillas dobles.
sep: el separador de campo. Los valores dentro de cada fila x están separados por este caracter.
na: el caracter a utilizar para los valores faltantes (NA) en los datos.
write.table(x, file = "", append = FALSE, quote = TRUE, sep = " ",
na = "NA", dec = ".", row.names = TRUE, ...)dec: el caracter a utilizar para los puntos decimales en columnas numéricas o complejas: debe ser un solo caracter.
row.names and col.names: [Lógico] Indica si los nombres se escribirán junto con x.
Ahora, guardaremos la tabla que hemos editado.
write.table(p_eta_table, paste0(dirname(data.path), "/table_modified.csv"),
row.names = FALSE, sep = ",")Ahora, puedes ir a la carpeta correspondiente y comprobar si el archivo se ha escrito.
Además, podemos guardar un único objeto de R en una conexión y posteriormente restaurarlo usando las funciones saveRDS y readRDS.
Podemos utilizar la función rbind para combinar las filas de dos tablas separadas y formar una sola. Para este ejemplo, cargaremos tablas con las ciudades más pobladas de España e Italia.
spain.pop <- read.csv("...add file path…/Cities/Spain.csv", header = TRUE)
italy.pop <- read.csv("...add file path…/Cities/Italy.csv", header = TRUE)## City Population
## 1 Madrid 3334730
## 2 Barcelona 1664182
## 3 Val\xe8ncia 800215
## 4 Sevilla 691395
## 5 Zaragoza 681877
## 6 M\xe1laga 578460
Primero, agreguemos información sobre el país a la tabla, para que la tabla combinada incluya el país para cada entrada.
spain.pop$Country <- rep("Spain", times = nrow(spain.pop))
italy.pop$Country <- rep("Italy", times = nrow(italy.pop))
print(spain.pop)
## City Population Country
## 1 Madrid 3334730 Spain
## 2 Barcelona 1664182 Spain
## 3 Val\xe8ncia 800215 Spain
## 4 Sevilla 691395 Spain
## 5 Zaragoza 681877 Spain
## 6 M\xe1laga 578460 Spain
## 7 Murcia 459403 Spain
## 8 Palma 422587 Spain
## 9 Las Palmas de Gran Canaria 381223 Spain
## 10 Bilbao 350184 Spain
print(italy.pop)
## City Population Country
## 1 Roma 2808293 Italy
## 2 Milano 1406242 Italy
## 3 Napoli 948850 Italy
## 4 Torino 857910 Italy
## 5 Palermo 647422 Italy
## 6 Genova 565752 Italy
## 7 Bologna 395416 Italy
## 8 Firenze 366927 Italy
## 9 Bari 315284 ItalyAhora podemos usar la función rbind para unir las tablas.
De manera similar, la función cbind combinará objetos por columnas.
R utiliza los siguientes operadores relacionales:
< menor que
> mayor que
<= menor o igual que
>= mayor o igual que
== igual a
!= no igual a
Por ejemplo:
Los ciclos son muy importantes porque nos permiten hacer lo siguiente:
Ejecutar un cierto código solo si se cumple una condición (if)
Ejecutar el mismo proceso un número especificado de veces (for)
Continuar ejecutando un proceso hasta que se cumpla una condición (while)
R puede realizar ejecuciones condicionales de la forma:
La declaración condicional debe evaluar un único valor lógico. El proceso 1 se ejecutará si se cumple la condición, mientras que el proceso 2 se ejecutará cuando no se cumpla la condición.
Por ejemplo:
O:
Si los procesos contenidos en la condición requieren varias líneas, deben escribirse dentro de llaves.
Ten en cuenta que la declaración else no siempre es necesaria:
Un ejemplo de una cláusula else dentro de un ciclo if es el siguiente:
A veces, queremos ejecutar un ciclo si se cumple cualquiera de un conjunto de condiciones.
El ciclo for tiene la forma:
La variable se iterará durante el ciclo for tomando cada uno de los valores definidos en el vector. El proceso se aplicará en cada iteración. Por ejemplo:
Al igual que con la declaración if, si el proceso tiene más de una línea de código, debe estar rodeado por llaves.
Si escribes un ciclo dentro de otro ciclo, nos referimos a esto como un ciclo anidado,
Podemos utilizar un ciclo for en un análisis de series de tiempo espaciales.
El ciclo while tiene la forma:
La condición se evaluará, si es verdadera se ejecutará el proceso. Cuando la condición ya no se cumpla, el ciclo while se detendrá.
Por ejemplo:
La función plot es una función genérica. Esto significa que el tipo de gráfico producido depende del tipo o clase del primer argumento.
x: las coordenadas de los puntos en el gráfico (eje x) y: las coordenadas de los puntos en el gráfico (eje y) main: un título para el gráfico sub: un subtítulo para el gráfico xlab e ylab: títulos para los ejes x e y
Nota: y se puede omitir si x tiene la estructura adecuada (por ejemplo, para un archivo ráster)
type: qué tipo de gráfico debe dibujarse. Los posibles tipos son:
Para mostrar el primer conjunto de ejemplos de gráficos, leeremos un archivo csv con datos del Banco Mundial para el rendimiento promedio anual de los cultivos de cereales tanto para el mundo como para Alemania.
Cuando tenemos muchos registros de datos almacenados en un objeto, podemos usar las funciones head y tail para ver los seis primeros y los últimos seis registros, respectivamente.
Nota: los valores presentados están en kg/ha.
head(crop.yield)
## Year Global_Cereal_Yield German_Cereal_Yield
## 1 1961 1431.537 2417.4
## 2 1962 1523.116 2962.2
## 3 1963 1589.004 2925.2
## 4 1964 1589.813 3120.8
## 5 1965 1639.062 2852.2
## 6 1966 1680.538 2878.0
tail(crop.yield)
## Year Global_Cereal_Yield German_Cereal_Yield
## 52 2012 3619.562 6964.9
## 53 2013 3824.374 7318.0
## 54 2014 3892.360 8050.3
## 55 2015 3938.770 7497.8
## 56 2016 3967.029 7182.1
## 57 2017 4074.176 7269.9Comencemos con un gráfico de líneas para los valores globales.
Nota: obtendremos el mismo resultado seleccionando las posiciones de cada columna en lugar de los nombres: es decir, plot(crop.yield[,1], crop.yield[,2], type = “l”).
Ahora, volveremos a crear el gráfico de una manera más personalizada (título del gráfico, títulos de los ejes, valores mínimos y máximos definidos por el usuario).
plot(crop.yield$Year, crop.yield$Global_Cereal_Yield, type = "l",
main = "Producción media de cereales", xlab = "Año",
ylab = "Producción media (kg/ha)", ylim = c(0, 10000))La función lines se utiliza para agregar otra línea a un gráfico existente. La función legend se utiliza para agregar una leyenda al gráfico.
lines(crop.yield$Year, crop.yield$German_Cereal_Yield, col = "red")
legend("topleft", c("Global", "Alemania"), lty = 1, col = c("black", "red"))La función points se utiliza para agregar puntos a un gráfico existente. pch selecciona el caracter de trazado y col el color de trazado.
También podemos representar la información usando un gráfico de dispersión.
Nota: la opción de gráfico predeterminada es con puntos. Por lo tanto, si no especificamos el tipo, obtendremos el mismo resultado.
Un histograma es una representación gráfica de la distribución de datos numéricos.
Ejemplo: los valores diarios de temperatura (en °C) para abril en una ciudad particular son:
La función hist genera un histograma.
De nuevo, podemos personalizar el histograma.
hist(temp, main = "Histogram of temperature in April", xlab = "Temp [°C]",
border = "blue", col = "cyan", breaks = 8)Recuerda pensar cuidadosamente cómo graficar y analizar tus datos.
La función boxplot produce un boxplot para valores (agrupados).
Ahora importemos los valores diarios para la temperatura máxima en una ciudad piloto.
print(daily.temp)
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1 15.0 17.8 20.6 32.2 27.2 22.8 32.2 31.1 30.0 30.6 24.4 17.2
## 2 15.6 16.7 18.3 22.8 29.4 22.8 32.2 33.9 29.4 31.1 28.9 17.2
## 3 12.8 16.1 20.0 21.1 35.0 26.1 32.2 32.8 28.3 27.2 25.6 16.7
## 4 17.8 18.9 23.3 27.2 32.8 23.3 31.7 32.8 31.7 19.4 15.6 17.2
## 5 21.7 21.7 27.8 24.4 30.0 25.6 33.9 30.0 27.8 17.2 17.8 17.8
## 6 21.1 25.0 20.0 19.4 25.6 22.8 34.4 29.4 36.7 18.9 14.4 18.3
## 7 16.1 26.7 15.0 16.7 22.2 23.3 32.8 29.4 37.8 22.8 17.8 19.4
## 8 15.0 17.2 21.1 14.4 20.0 22.2 31.1 29.4 37.8 27.2 21.1 19.4
## 9 15.0 21.1 28.9 14.4 17.2 21.1 30.6 27.2 27.8 28.9 25.6 21.1
## 10 17.8 20.6 26.7 20.0 21.7 21.1 29.4 26.7 23.9 28.3 23.9 21.7
## 11 21.1 23.3 23.9 22.2 22.8 23.3 27.8 26.7 26.7 28.3 25.0 15.6
## 12 22.8 26.7 19.4 21.7 25.6 22.8 25.0 26.7 29.4 38.3 17.8 11.7
## 13 23.9 23.9 21.1 18.9 24.4 25.6 25.0 25.6 27.8 37.2 22.8 12.2
## 14 27.2 19.4 25.0 23.3 20.0 27.2 23.3 28.3 25.6 31.1 21.7 16.1
## 15 26.7 19.4 25.6 30.0 17.8 27.2 24.4 28.9 25.6 27.2 20.6 15.0
## 16 27.2 16.1 24.4 33.3 18.9 25.6 25.0 30.0 22.2 26.1 21.7 17.8
## 17 28.9 16.1 22.8 27.8 17.2 23.9 26.7 31.1 24.4 29.4 21.7 19.4
## 18 28.9 18.9 20.6 18.3 17.2 25.0 28.9 30.0 27.2 26.7 15.6 14.4
## 19 20.6 14.4 17.2 20.6 20.6 24.4 30.6 27.2 27.2 22.8 16.1 14.4
## 20 24.4 13.9 15.6 20.0 22.2 27.8 31.1 27.8 27.8 23.9 16.1 17.8
## 21 25.0 16.1 15.6 20.0 25.6 32.2 30.6 26.7 28.3 22.8 16.1 18.3
## 22 22.2 16.1 16.7 20.6 21.1 30.6 27.8 29.4 30.6 28.9 19.4 18.9
## 23 24.4 15.6 19.4 20.6 20.0 29.4 28.9 31.1 28.3 28.9 17.8 20.0
## 24 23.9 15.6 16.7 20.0 22.8 27.8 28.3 31.7 25.0 21.7 16.7 22.8
## 25 23.3 15.0 16.7 22.2 26.1 29.4 33.3 33.3 23.3 20.0 18.9 23.3
## 26 25.0 11.7 15.6 22.8 23.3 29.4 30.0 35.0 26.7 21.1 27.8 23.3
## 27 25.0 13.9 18.9 28.3 26.7 31.7 26.1 36.1 30.0 24.4 28.9 21.1
## 28 24.4 18.9 18.3 28.3 22.2 28.3 27.8 33.3 27.8 27.2 27.2 26.1
## 29 20.6 NA 23.3 22.8 17.8 26.7 34.4 35.0 27.8 28.3 26.7 25.6
## 30 15.0 NA 29.4 26.7 26.1 28.9 36.7 32.2 31.1 31.1 23.3 22.8
## 31 17.2 NA 32.2 NA 26.1 NA 29.4 30.0 NA 28.9 NA 25.0Para generar un boxplot con los datos:
boxplot(daily.temp, main = "Temperatura máxima diaria en la ciudad X en 2011",
col = "cyan", ylab = "Temp máx (C)")La función barplot crea un gráfico de barras con barras verticales u horizontales.
Personalicemos el gráfico de barras.
barplot(crop.yield$Global_Cereal_Yield, main = "Rendimiento global de cereales",
sub = "Datos del Banco Mundial", xlab = " Año", ylab = "Rendimiento (kg/ha)", names.arg = crop.yield$Year)Algunas otras opciones para cambiar cómo se presenta la información en un gráfico de barras:
col para agregar color al gráfico
horiz para crear un gráfico de barras horizontal (configurado en TRUE)
La función pie dibuja un gráfico de pastel.
slices <- c(10, 12, 4, 16, 8)
country <- c("Mexico", "Argentina", "Chile", "Uruguay", "Paraguay")
pie(slices, labels = country)Más personalizado: